// 1. 引入云对象，请根据你的实际情况修改路径和对象名
const friendService = uniCloud.importObject('friend',{customUI:true}); // 假设你的云对象名为 'friend-service'
export default class ContactManager {
	constructor(currentUser, existingFriends = [], options = {}) {
		this.user=currentUser
		this.currentUserId = currentUser.userId;
		this.existingFriends = existingFriends;
		this.options = {
			showToast: options.showToast || (msg => uni.showToast({
				title: msg,
				icon: 'none',
				duration: 2000,
				position: 'center'
			})),
			showLoading: options.showLoading || (msg => uni.showLoading({
				title: msg,
				mask: true
			})),
			hideLoading: options.hideLoading || (() => uni.hideLoading())
		};
		this.isFirstTime = null;
		this.isLoading = false; // 增加加载标志位，防止重复调用
	}

	// 2. 修改：判断是否为首次通过通讯录添加好友
	async isFirstTimeGettingContacts() {

		if (this.isFirstTime !== null) return this.isFirstTime;

		try {
			const nowTime = Date.now()
			const sveneDays = 24 * 7 * 3600 * 1000
			const lastTime = uni.getStorageSync('lastContact') || 0
			return nowTime - lastTime > sveneDays

		} catch (error) {
			this.isFirstTime = true; // 出错时默认按首次处理
			return true;
		}
	}

	// 核心加载方法

	async loadContacts(page = 1, pageSize = 30, keyword = '') {
		if (this.isLoading) {
	
			return [];
		}
		try {
		
			this.isLoading = true
			const isFirst = await this.isFirstTimeGettingContacts();
		   console.log('是否第一次有通讯录？',isFirst);

			let friends; // 声明一个变量来接收结果

			// 根据 isFirst 的值，调用不同的加载方法
			if (isFirst) {
			
				// 如果是首次，则执行同步通讯录的逻辑
				friends = await this._firstTimeLoad(page, pageSize, keyword);
			} else {
			
				// 如果不是首次，则直接从云端加载好友列表
				friends = await this._nonFirstTimeLoad(page, pageSize, keyword);
			}

			this.options.hideLoading();
			
			
			return friends

		} catch (error) {
			this.options.hideLoading();
			console.error("加载失败：", error);

			return {success:false}
		} finally {
			this.isLoading = false
		}
	}

	// 3. 修改：首次加载逻辑
	async _firstTimeLoad(page, pageSize, keyword) {
		// 1. 检查权限
		const hasPermission = await this.checkPermission();

		if (!hasPermission) {
			this.options.showToast("请开启通讯录权限");
			return [];
		}

		// 2. 获取本地通讯录
		const rawContacts = await this._getAllLocalContacts();
	
		if (rawContacts.length === 0) {
			//this.options.showToast("未检测到通讯录数据");
			return [];
		}

		// 3. 上传到云端并创建好友关系
		try {
			//this.options.showLoading("正在上传通讯录并创建好友关系...");
			const uploadResult = await friendService.uploadContactsToDB({user:this.user,contacts:rawContacts});
			console.warn("通讯录上传结果:", uploadResult);
			if (uploadResult.success) {
				//this.options.showToast(uploadResult.message || "通讯录好友关系创建成功");
				uni.setStorageSync('lastContact', Date.now())

			} else {
				uni.setStorageSync('lastContact', 0)
				// this.options.showToast(uploadResult.message || "通讯录好友关系创建失败");
			}
		} catch (uploadError) {
			console.error("上传通讯录到云端失败：", uploadError);
			uni.setStorageSync('lastContact', 0)
			// this.options.showToast("上传通讯录失败，请检查网络");
		}

		// 4. 直接从好友表加载数据
		return this._loadFriendsFromDB(page, pageSize, keyword);
	}

	// 4. 修改：非首次加载逻辑 (现在和首次加载的最终步骤一样)
	async _nonFirstTimeLoad(page, pageSize, keyword) {
		// 直接从好友表加载最新数据
		return this._loadFriendsFromDB(page, pageSize, keyword);
	}

	// 5. 新增：从云端 friend_relation 表加载好友数据
	async _loadFriendsFromDB(page, pageSize, keyword='') {
		try {
			// 调用云对象中获取好友列表的方法
			// 假设你的云对象中有一个 getFriendList 方法
			const friendListResult = await friendService.getFriendList({
				userId: this.currentUserId,
				keyword: keyword,
				page: page,
				pageSize: pageSize
			});
	
		console.log(page,pageSize,keyword,"结果............",friendListResult);
			if (friendListResult.success && friendListResult.data) {
				return friendListResult;
			} else {
				// console.warn("从云端获取好友列表失败:", friendListResult.message);
				return [];
			}
		} catch (error) {
			console.error("调用云对象获取好友列表失败:", error);
			//this.options.showToast("加载好友列表失败");
			return [];
		}
	}

	// 辅助方法：获取所有本地通讯录
	// 辅助方法：获取所有本地通讯录并进行格式化处理
	async _getAllLocalContacts() {
	  let rawContacts = [];
	
	  // #ifdef APP-PLUS
	  try {
	    const addressBook = await this._getAddressBookPlus();
	    rawContacts = await this._findAllContactsPlus(addressBook);
	   
	  } catch (error) {
	    console.error("APP端获取本地通讯录失败：", error);
	  }
	  // #endif
	
	  // #ifdef MP-WEIXIN
	  try {
	    const contact = await wx.chooseContact();
	    if (contact) rawContacts.push(contact);
	    console.log("小程序获取原始通讯录共", rawContacts.length, "条");
	  } catch (e) {
	    console.warn("小程序获取通讯录限制或用户取消：", e);
	  }
	  // #endif
	
	  // #ifdef H5
	  console.log('H5 不支持获取本地通讯录');
	  // #endif
	
	  // --- 核心处理逻辑开始 ---
	  const uniquePhoneNumbers = new Set();
	  const formattedContacts = [];
	
	  for (const contact of rawContacts) {
	    const displayName = contact.displayName || '';
	    const phoneNumbers = contact.phoneNumbers || [];
	
	    for (const phone of phoneNumbers) {
	      let number = phone.value || '';
	
	      // 1. 清洗：去除所有非数字字符（包括+、-、空格等）
	      let cleanedNumber = number.replace(/\D/g, '');
	
	      // 2. 处理前缀：优先移除最长匹配的前缀，避免部分匹配导致错误
	      if (cleanedNumber.startsWith('0086')) {
	        cleanedNumber = cleanedNumber.slice(4); // 移除 0086（4位）
	      } else if (cleanedNumber.startsWith('86')) {
	        cleanedNumber = cleanedNumber.slice(2); // 移除 86（2位）
	      } else if (cleanedNumber.startsWith('0')) {
	        cleanedNumber = cleanedNumber.slice(1); // 移除开头单个 0
	      }
	
	      // 3. 过滤：仅保留 11 位且以 1 开头的有效手机号
	      if (cleanedNumber.length === 11 && /^1/.test(cleanedNumber)) {
	        if (!uniquePhoneNumbers.has(cleanedNumber)) {
	          uniquePhoneNumbers.add(cleanedNumber);
	          formattedContacts.push({
	            telephone: cleanedNumber,
	            displayName: displayName
	          });
	        }
	      }
	    }
	  }
	
	  return formattedContacts;
	}

	// 权限检查 (逻辑不变)
	async checkPermission() {
		// #ifdef APP-PLUS
		return new Promise((resolve) => {
			plus.android.requestPermissions(
				['android.permission.READ_CONTACTS'],
				(result) => resolve(result.granted?.includes('android.permission.READ_CONTACTS')),
				() => resolve(false)
			);
		});
		// #endif

		// #ifdef MP-WEIXIN
		return new Promise((resolve) => {
			wx.getSetting({
				success: res => {
					if (res.authSetting['scope.addressBook']) return resolve(true);
					wx.authorize({
							scope: 'scope.addressBook'
						})
						.then(() => resolve(true))
						.catch(() => resolve(false));
				},
				fail: () => resolve(false)
			});
		});
		// #endif

		// #ifdef H5
		return false;
		// #endif
	}

	// APP端原生方法 (逻辑不变)
	_getAddressBookPlus() {
		return new Promise((resolve, reject) => {
			plus.contacts.getAddressBook(0, resolve, reject);
		});
	}

	_findAllContactsPlus(addressBook) {
		return new Promise((resolve, reject) => {
			addressBook.find(['displayName', 'phoneNumbers'], resolve, reject);
		});
	}

	// 重置功能
	async reset() {
		// 重置首次获取状态
		this.isFirstTime = null;
		uni.setStorageSync('lastContact', 0)
		// 注意：这里不再删除本地缓存或 user_contacts 表
		// 如果需要删除通过通讯录添加的好友，需要调用额外的云对象方法
		this.options.showToast("已重置通讯录加载状态");
	}
}